/****************************************************************************
 * dffs.v
 ****************************************************************************/

/**
 * Module: 
 * 
 */
`timescale 1ns / 10ps

`define DLY 1

module dfflrs 
# (
    parameter DW = 32
) 
(
    input                rst,
    input                clk,
    input                en, 
    input       [DW-1:0] d,
    output      [DW-1:0] q
);

reg [DW-1:0] q_r;

always @(posedge clk or posedge rst)
begin : DFFLRS_PROC
    if (rst == 1'b1)
        q_r <= {DW{1'b1}};
    else if (en == 1'b1)
        q_r <= #`DLY d;
end

assign q = q_r;

`ifdef X_CHECK//{
xchecker # (.DW(1)) 
xchecker
(
    .i_dat(en),
    .clk  (clk)
);
`endif//}
    

endmodule
// ===========================================================================
//
// Description:
//  Verilog module sirv_gnrl DFF with Load-enable and Reset
//  Default reset value is 0
//
// ===========================================================================

module dfflr # (parameter DW = 32) 
(
    input               rst,
    input               clk,

    input               en, 
    input      [DW-1:0] d,
    output     [DW-1:0] q
);

reg [DW-1:0] q_r;

always @(posedge clk or posedge rst)
begin : DFFLR_PROC
    if (rst == 1'b1)
        q_r <= {DW{1'b0}};
    else if (en == 1'b1)
        q_r <= #`DLY d;
end

assign q = q_r;

`ifdef X_CHECK//{
xchecker # (.DW(1)) 
xchecker
(
    .i_dat(en),
    .clk  (clk)
);
`endif//}
    

endmodule
// ===========================================================================
//
// Description:
//  Verilog module sirv_gnrl DFF with Load-enable, no reset 
//
// ===========================================================================

module dffl # (parameter DW = 32) 
(
    input               clk,
    input               en, 
    input      [DW-1:0] d,
    output     [DW-1:0] q
);

reg [DW-1:0] q_r;

always @(posedge clk)
begin : DFFL_PROC
    if (en == 1'b1)
        q_r <= #`DLY d;
end

assign q = q_r;

`ifdef X_CHECK//{
xchecker # (.DW(1)) 
xchecker
(
    .i_dat(en),
    .clk  (clk)
);
`endif//}
    

endmodule
// ===========================================================================
//
// Description:
//  Verilog module sirv_gnrl DFF with Reset, no load-enable
//  Default reset value is 1
//
// ===========================================================================

module dffrs # (parameter DW = 32) 
(
  input               rst,
  input               clk,

  input      [DW-1:0] d,
  output     [DW-1:0] q
);

reg [DW-1:0] q_r;

always @(posedge clk or posedge rst)
begin : DFFRS_PROC
    if (rst == 1'b1)
        q_r <= {DW{1'b1}};
    else                  
        q_r <= #`DLY d;
end

assign q = q_r;

endmodule
// ===========================================================================
//
// Description:
//  Verilog module sirv_gnrl DFF with Reset, no load-enable
//  Default reset value is 0
//
// ===========================================================================

module dffr # (parameter DW = 32) 
(
    input               rst,
    input               clk,

    input      [DW-1:0] d,
    output     [DW-1:0] q
);

reg [DW-1:0] q_r;

always @(posedge clk or posedge rst)
begin : DFFR_PROC
    if (rst == 1'b1)
        q_r <= {DW{1'b0}};
    else                  
        q_r <= #`DLY d;
end

assign q = q_r;

endmodule
// ===========================================================================
//
// Description:
//  Verilog module for general latch 
//
// ===========================================================================

module ltch # (parameter DW = 32) 
(

  input               en, 
  input      [DW-1:0] d,
  output     [DW-1:0] q
);

reg [DW-1:0] q_r;

always @ * 
begin : LTCH_PROC
  if (en == 1'b1)
    q_r <= d;
end

assign q = q_r;

`ifdef X_CHECK//{
xchecker # (.DW(1)) 
xchecker
(
    .i_dat(en),
    .clk  (clk)
);
`endif//}    

endmodule
